package demo.dao;

import java.io.IOException;
import java.util.List;



import demo.helper.WSHTTPClientHelper;

import demo.util.ParseaSalida;

public class JBPMDao {

	
	
	/*public String invocarServicioIniciaProceso(String ejecutivoCAP){
		
		String ws="http://localhost:8080/ESBPOC/ebws/jbpm/IniciaProcesoJBPM?wsdl";

    	WSHTTPClientHelper wsClient = new WSHTTPClientHelper(ws);
    	String soapAction = "http://soa.jboss.org/jbpm/IniciaProcesoJBPMOpResp";
    		
    	String mensajeSOAP = construyeSoapEntradaProceso(ejecutivoCAP);
    	String salidaSOAP="";
    	try {
			wsClient.executeMethod(mensajeSOAP, 5000, soapAction);
			salidaSOAP = wsClient.getResponseBody();
		} catch (IOException e) {
			System.err.println(e.getMessage());
		}
		
		ParseaSalidaSOAP parse = new ParseaSalidaSOAP();
		String key = parse.parseaSalidaInicioProceso(salidaSOAP);

		return key;
    	
	}

	private String construyeSoapEntradaProceso(String ejecutivoCAP) {
		String mensaje ="<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:ent=\"http://www.example.org/entrada\">" +
				"<soapenv:Header/>" +
				"<soapenv:Body>" +
					"<ent:Ejecutivo>" +
						"<ent:nombreEjecutivo>"+ejecutivoCAP+"</ent:nombreEjecutivo>" +
					"</ent:Ejecutivo>" +
				"</soapenv:Body>" +
				"</soapenv:Envelope>";
		return mensaje;
	}

	public void finalizarApertura(String key, String transicion){
		System.out.println("Signal");
		JbpmConfiguration conf = JbpmConfiguration.getInstance();
		
		JbpmContext ctx = conf.createJbpmContext();
		
			
		
		try{				
			GraphSession gs = ctx.getGraphSession();
			 
			//se busca la ultima version de la defincion de proceso 'process'
			ProcessDefinition pd = gs.findLatestProcessDefinition("procesoIPS");
			
			//se obtienen todas las instancias de procesos asociadas a la definicion de proceso
			List<ProcessInstance> listPI =  gs.findProcessInstances(pd.getId());
						
			
			//se itera sobre la lista de instancias
			long instanciaId = 0;
			for (int i = 0; i < listPI.size() ; i++) {
						if(listPI.get(i).getKey().equals(key)){
							System.out.println("Haciendo signal a la instancia :"+listPI.get(i).getId());
							listPI.get(i).signal(transicion);
							break;
						}
				
			}
			

		}catch (Exception e) {
			System.out.println(e);
		}
		
		finally{
			try{			
				ctx.close();
				conf.close();
			}catch (Exception e) {
				System.out.println(e);
			}
		}

	}
	
	public void cierraTarea(int taskId){
		System.out.println("Finalizando Tarea");
		
		JbpmConfiguration conf = JbpmConfiguration.getInstance();
		
		JbpmContext ctx = conf.createJbpmContext();
		
			
		
		try{				
			GraphSession gs = ctx.getGraphSession();
			 
			//se busca la ultima version de la defincion de proceso 'process'
			ProcessDefinition pd = gs.findLatestProcessDefinition("procesoIPS");
			
			//se obtienen todas las instancias de procesos asociadas a la definicion de proceso
			List<ProcessInstance> listPI =  gs.findProcessInstances(pd.getId());
					
			TaskMgmtSession taskMgmtSession = ctx.getTaskMgmtSession();
			TaskInstance taskInstance = taskMgmtSession.getTaskInstance(taskId);
			taskInstance.end("calculo");
			

		}catch (Exception e) {
			System.out.println(e);
		}
		
		finally{
			try{			
				ctx.close();
				conf.close();
			}catch (Exception e) {
				System.out.println(e);
			}
		}

	}
	public List<Tarea>  traerTareasPorRol(String rol,String tipo){
		String ws = "http://localhost:8080/ESBPOC/ebws/tareas/ObtieneTareasDeRol?wsdl";
		WSHTTPClientHelper wsClient = new WSHTTPClientHelper(ws);
    	String soapAction = "http://soa.jboss.org/tareas/ObtieneTareasDeRolOpResp";
    		
    	String mensajeSOAP = construyeSoapTareaRol(rol,tipo);
    	String salidaWS ="";
    	try {
			wsClient.executeMethod(mensajeSOAP, 5000, soapAction);
			salidaWS = wsClient.getResponseBody();
		} catch (IOException e) {
			System.err.println(e.getMessage());
		}
		
		ParseaSalidaSOAP parse = new ParseaSalidaSOAP();
		List<Tarea> tareas =  parse.parseaSalidaListaTareas(salidaWS);
		return tareas;
		
	}
	private String construyeSoapEntrada(String rol) {
		return "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:ent=\"http://www.example.org/entrada\">" +
				"<soapenv:Header/>" +
				"<soapenv:Body>" +
				"<ent:entrada>"+rol+"</ent:entrada>" +
				"</soapenv:Body>" +
				"</soapenv:Envelope>";
	}
	private String construyeSoapTareaRol(String rol,String tipo) {
		return "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:tar=\"http://www.example.org/tareasRolEntrada\">" +
					"<soapenv:Header/>" +
						"<soapenv:Body>" +
							"<tar:Tarea>" +
								"<tar:rol>"+rol+"</tar:rol>" +
								"<tar:tipo>"+tipo+"</tar:tipo>" +
							"</tar:Tarea>" +
						"</soapenv:Body>" +
				"</soapenv:Envelope>";

	}
	
	public void seteaVariablesTarea(String key, String nombreTarea, String variable, String valor){
		System.out.println("Signal");
		JbpmConfiguration conf = JbpmConfiguration.getInstance();
		
		JbpmContext ctx = conf.createJbpmContext();
		
			
		
		try{				
			GraphSession gs = ctx.getGraphSession();
			 
			//se busca la ultima version de la defincion de proceso 'process'
			ProcessDefinition pd = gs.findLatestProcessDefinition("procesoIPS");
			
			//se obtienen todas las instancias de procesos asociadas a la definicion de proceso
			List<ProcessInstance> listPI =  gs.findProcessInstances(pd.getId());
						
			
			//se itera sobre la lista de instancias
			long instanciaId = 0;
			for (int i = 0; i < listPI.size() ; i++) {
						if(listPI.get(i).getKey().equals(key)){
							TaskMgmtSession taskMgmtSession = ctx.getTaskMgmtSession();
							List process = taskMgmtSession.findTaskInstancesByProcessInstance(listPI.get(i));
							for (int j = 0; j < process.size(); j++) {
								TaskInstance ti = (TaskInstance) process.get(j);
								if(ti.getName().equals(nombreTarea)){
									ti.setVariable(variable, valor);								
									break;
								}
							}
							listPI.get(i).getContextInstance().setVariable(variable, valor);
							break;
						}
				
			}
			

		}catch (Exception e) {
			System.out.println(e);
		}
		
		finally{
			try{			
				ctx.close();
				conf.close();
			}catch (Exception e) {
				System.out.println(e);
			}
		}
	}*/
}
